home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SNNSV32.ZIP
/
SNNSv3.2
/
kernel
/
sources
/
kr_amap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-25
|
159KB
|
6,171 lines
/*****************************************************************************
FILE : kr_amap.c
SHORTNAME :
SNNS VERSION : 3.2
PURPOSE : SNNS Kernel Functions for ARTMAP networks
NOTES :
AUTHOR : Kai-Uwe Herrmann
DATE : 17.05.92
CHANGED BY : Sven Doering
IDENTIFICATION : @(#)kr_amap.c 1.7 3/15/94
SCCS VERSION : 1.7
LAST CHANGE : 3/15/94
Copyright (c) 1990-1994 SNNS Group, IPVR, Univ. Stuttgart, FRG
******************************************************************************/
#include <stdlib.h>
#ifndef NULL /* if NULL pointer is not defined include stdio.h */
#include <stdio.h>
#endif
#include "kr_const.h"
#include "kr_mac.h"
#include "kr_def.h"
#include "kr_typ.h"
#include "kr_funcs.h"
#include "kernel.h"
#include "glob_typ.h"
#include "kr_art.h" /* Function prototypes for ART networks */
#include "krart_df.h" /* Definitions for ART networks */
#include "kr_amap.ph"
/*#################################################
GROUP: ARTMAP kernel functions
by Kai-Uwe Herrmann
#################################################*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
krui_err kram_init_i_act (double rhoa, double rhob, double rho)
{
int ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
FOR_ALL_UNITS (unit_ptr) {
switch (unit_ptr->lln) {
case ARTMAP_SPECa_LAY:
switch (unit_ptr->lun) {
case ARTMAP_G1a_UNIT :
unit_ptr->i_act = 0.0;
break;
case ARTMAP_RIa_UNIT :
unit_ptr->i_act = 1.0;
break;
case ARTMAP_RGa_UNIT :
unit_ptr->i_act = 1.0;
break;
case ARTMAP_RHOa_UNIT :
unit_ptr->i_act = (FlintType) rhoa;
break;
default :
unit_ptr->i_act = 0.0;
break;
} /*switch*/
break;
case ARTMAP_SPECb_LAY:
switch (unit_ptr->lun) {
case ARTMAP_G1b_UNIT :
unit_ptr->i_act = 0.0;
break;
case ARTMAP_RIb_UNIT :
unit_ptr->i_act = 1.0;
break;
case ARTMAP_RGb_UNIT :
unit_ptr->i_act = 1.0;
break;
case ARTMAP_RHOb_UNIT :
unit_ptr->i_act = (FlintType) rhob;
break;
default :
unit_ptr->i_act = 0.0;
break;
} /*switch*/
break;
case ARTMAP_SPEC_LAY:
switch (unit_ptr->lun) {
case ARTMAP_G_UNIT:
unit_ptr->i_act = 1.0;
break;
case ARTMAP_RHO_UNIT:
unit_ptr->i_act = (FlintType) rho;
break;
default:
unit_ptr->i_act = 0.0;
break;
} /*switch*/
break;
default :
unit_ptr->i_act = 0.0;
break;
} /*switch*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_init_i_act () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
krui_err kram_sort (void)
{
krui_err ret_code = KRERR_NO_ERROR;
TopoPtrArray topo_ptr = topo_ptr_array;
int no_of_cmpa_units = 0;
int no_of_dela_units = 0;
int no_of_rsta_units = 0;
int no_of_speca_units = 0;
int no_of_cmpb_units = 0;
int no_of_delb_units = 0;
int no_of_rstb_units = 0;
int no_of_specb_units = 0;
int no_of_map_units = 0;
int no_of_spec_units = 0;
/* initialize ARTMAP sorting
*/
krart_init_sorting ();
/* get no of input units
*/
NoOfInputUnits = krart_get_NoOfInputUnits ();
if (NoOfInputUnits == 0) {
ret_code = KRERR_NO_INPUT_UNITS;
return (ret_code);
} /*if*/
/* insert the initial NULL-ptr into the topo ptr array
*/
*topo_ptr++ = NULL;
/********** determine unit types for ARTa and insert them into topo ptr array
**********/
/* determine input units of ARTa
*/
ret_code = kram_get_InpUnits_a (&topo_ptr, &ArtMap_NoOfInpUnits_a);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (ArtMap_NoOfInpUnits_a == 0) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa input");
} /*if*/
*topo_ptr++ = NULL;
/* determine comparison units of ARTa
*/
ret_code = kram_get_CmpUnits_a (&topo_ptr, &no_of_cmpa_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_cmpa_units != ArtMap_NoOfInpUnits_a) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa comparison");
} /*if*/
*topo_ptr++ = NULL;
/* determine recognition units of ARTa
*/
ret_code = kram_get_RecUnits_a (&topo_ptr, &ArtMap_NoOfRecUnits_a);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (ArtMap_NoOfRecUnits_a == 0) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa recognition");
} /*if*/
*topo_ptr++ = NULL;
/* determine delay units of ARTa
*/
ret_code = kram_get_DelUnits_a (&topo_ptr, &no_of_dela_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_dela_units != ArtMap_NoOfRecUnits_a + 3) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa delay");
} /*if*/
*topo_ptr++ = NULL;
/* determine local reset units of ARTa
*/
ret_code = kram_get_RstUnits_a (&topo_ptr, &no_of_rsta_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_rsta_units != ArtMap_NoOfRecUnits_a) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa reset");
} /*if*/
*topo_ptr++ = NULL;
/* determine special units of ARTa
*/
ret_code = kram_get_SpecUnits_a (&topo_ptr, &no_of_speca_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_speca_units != ARTMAP_NO_OF_SPECa_UNITS) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTa special");
} /*if*/
*topo_ptr++ = NULL;
/********** determine unit types for ARTb and insert them into topo ptr array
**********/
/* determine input units of ARTb
*/
ret_code = kram_get_InpUnits_b (&topo_ptr, &ArtMap_NoOfInpUnits_b);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (ArtMap_NoOfInpUnits_b == 0) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb input");
} /*if*/
*topo_ptr++ = NULL;
/* determine comparison units of ARTb
*/
ret_code = kram_get_CmpUnits_b (&topo_ptr, &no_of_cmpb_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_cmpb_units != ArtMap_NoOfInpUnits_b) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb comparison");
} /*if*/
*topo_ptr++ = NULL;
/* determine recognition units of ARTb
*/
ret_code = kram_get_RecUnits_b (&topo_ptr, &ArtMap_NoOfRecUnits_b);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (ArtMap_NoOfRecUnits_b == 0) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb recognition");
} /*if*/
*topo_ptr++ = NULL;
/* determine delay units of ARTb
*/
ret_code = kram_get_DelUnits_b (&topo_ptr, &no_of_delb_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_delb_units != ArtMap_NoOfRecUnits_b + 3) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb delay");
} /*if*/
*topo_ptr++ = NULL;
/* determine local reset units of ARTb
*/
ret_code = kram_get_RstUnits_b (&topo_ptr, &no_of_rstb_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_rstb_units != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb reset");
} /*if*/
*topo_ptr++ = NULL;
/* determine special units of ARTb
*/
ret_code = kram_get_SpecUnits_b (&topo_ptr, &no_of_specb_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_specb_units != ARTMAP_NO_OF_SPECb_UNITS) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("ARTb special");
} /*if*/
*topo_ptr++ = NULL;
/********** determine unit types for MAP-Field and insert them into topo ptr array
**********/
/* determine map units
*/
ArtMap_map_layer = topo_ptr;
ret_code = kram_get_MapUnits (&topo_ptr,&no_of_map_units);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_map_units != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("map");
} /*if*/
*topo_ptr++ = NULL;
/* determine special units
*/
ret_code = kram_get_SpecUnits (&topo_ptr, &no_of_spec_units);;
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
if (no_of_spec_units != 10) {
TOPO_MSG_NO_OF_UNITS_IN_LAYER ("Map Field special");
} /*if*/
*topo_ptr++ = NULL;
*topo_ptr = NULL; /* set second NULL pointer at the end */
/* check if the logical type of really all units is determined
*/
if (krart_check_undeterminedUnits ()) {
ret_code = topo_msg.error_code;
return (ret_code);
} /*if*/
/* Now check the topo ptr array
*/
ret_code = kram_TopoPtrArray ();
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check the sites
*/
ret_code = kram_Sites ();
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check link structure
*/
topo_ptr = topo_ptr_array + 1;
/* Check links of inpa units
*/
ret_code = kram_LinksToInpUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of cmpa units
*/
ret_code = kram_LinksToCmpUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of reca units
*/
ret_code = kram_LinksToRecUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of dela units and d1a, d2a, d3a
*/
ret_code = kram_LinksToDelUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of rsta units
*/
ret_code = kram_LinksToRstUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of special units of ARTa
*/
ret_code = kram_LinksToSpecUnits_a (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of inpb units
*/
ret_code = kram_LinksToInpUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of cmpb units
*/
ret_code = kram_LinksToCmpUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of recb units
*/
ret_code = kram_LinksToRecUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of delb units and d1b, d2b, d3b
*/
ret_code = kram_LinksToDelUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of rstb units
*/
ret_code = kram_LinksToRstUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of special units of ARTb
*/
ret_code = kram_LinksToSpecUnits_b (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of map units
*/
ret_code = kram_LinksToMapUnits (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* Check links of special units of MAPFIELD
*/
ret_code = kram_LinksToSpecUnits (&topo_ptr);
if (ret_code != KRERR_NO_ERROR) {
return (ret_code);
} /*if*/
/* initialize the fix weights of ARTMAP
*/
ret_code = kram_init_fix_weights ();
return (ret_code);
} /* kram_sort () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
int kram_getClassNo (void)
{
TopoPtrArray topo_ptr = ArtMap_map_layer;
int i;
/* if ARTMAP sorting wasn't performed then return negative value
to indicate mistake
*/
if (topo_ptr == NULL) {
return (-1);
} /*if*/
/* look for winning unit */
for (i = 1; (i <= ArtMap_NoOfRecUnits_b) || ((*topo_ptr)->act >= 0.9);
i++, topo_ptr++
);
if ((i > ArtMap_NoOfRecUnits_b) && ((*topo_ptr)->act < 0.9)) {
return (-1);
} else {
return (topo_ptr - ArtMap_map_layer + 1);
} /*if*/
} /* kram_getClassNo () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
bool kram_AllMapUnitsActive (void)
{
TopoPtrArray topo_ptr = ArtMap_map_layer;
if (topo_ptr == NULL) {
return (FALSE);
} /*if*/
while (*topo_ptr != NULL) {
if ((*topo_ptr)->act < 0.9) {
return (FALSE);
} /*if*/
} /*while*/
return (TRUE);
} /* kram_AllMapUnitsActive () */
/*___________________________________________________________________________*/
/************* functions to determine units of ARTa
*************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_InpUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_src_ptr, *unit_trg_ptr;
register struct Site *site_trg_ptr;
register struct Link *link_trg_ptr;
int count_links;
/* for the inpa units it is characteristical that they have got 5
links to other units while the ones of ARTb just have 4
*/
*no_of_units = 0;
FOR_ALL_UNITS (unit_src_ptr) {
if (IS_INPUT_UNIT (unit_src_ptr)) {
if (UNIT_HAS_INPUTS (unit_src_ptr)) {
topo_msg.error_code = KRERR_I_UNITS_CONNECT;
topo_msg.dest_error_unit = unit_src_ptr-unit_array;
topo_msg.src_error_unit = 0;
return (topo_msg.error_code);
} /*if*/
count_links = 0;
FOR_ALL_UNITS (unit_trg_ptr) {
if (UNIT_HAS_SITES (unit_trg_ptr)) {
FOR_ALL_SITES_AND_LINKS (unit_trg_ptr, site_trg_ptr, link_trg_ptr) {
if (link_trg_ptr->to == unit_src_ptr) {
count_links++;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
} else {
FOR_ALL_LINKS (unit_trg_ptr, link_trg_ptr) {
if (link_trg_ptr->to == unit_src_ptr) {
count_links++;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (count_links == 5) {
if (!(CHECK_ACT_FUNC (unit_src_ptr, ARTMAP_ACTF_INPa))) {
TOPO_MSG_ACT_FUNC (unit_src_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_src_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_src_ptr);
} /*if*/
(*no_of_units)++;
**topo_ptr = unit_src_ptr;
unit_src_ptr->lln = ARTMAP_INPa_LAY;
(*topo_ptr)++;
unit_src_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_InpUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_CmpUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
struct Unit *unit_src_ptr;
register struct Link *link_ptr;
struct Link *link_src_ptr;
bool is_cmpa_unit;
bool has_link_to_inpa;
bool has_link_to_other_than_inpa;
*no_of_units = 0;
/* look for a reca unit */
FOR_ALL_UNITS (unit_ptr) {
if (!IS_SPECIAL_UNIT (unit_ptr)) {
/* we can continue the search, 'cause reca units have got
ttype special
*/
continue;
} /*if*/
/* the recognition unit is not supposed to have sites
*/
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
/* unit_ptr points to a recogniton unit.
we follow the incoming links of this unit. if the source unit we
got by doing this has the following properties, this is a comparison
unit of ARTa
- has no sites
- has incoming link from inpa unit
- has incoming link from other than inpa unit
*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
unit_src_ptr = link_ptr->to;
is_cmpa_unit = FALSE;
has_link_to_inpa = FALSE;
has_link_to_other_than_inpa = FALSE;
if (UNIT_HAS_DIRECT_INPUTS (unit_src_ptr)) {
FOR_ALL_LINKS (unit_src_ptr, link_src_ptr) {
if (link_src_ptr->to->lln == ARTMAP_INPa_LAY) {
has_link_to_inpa = TRUE;
} else {
has_link_to_other_than_inpa = TRUE;
} /*if*/
if (has_link_to_inpa && has_link_to_other_than_inpa) {
is_cmpa_unit = TRUE;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
if (is_cmpa_unit) {
if (!(CHECK_ACT_FUNC (unit_src_ptr, ARTMAP_ACTF_CMPa))) {
TOPO_MSG_ACT_FUNC (unit_src_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_src_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_src_ptr);
} /*if*/
unit_src_ptr->lln = ARTMAP_CMPa_LAY;
(*no_of_units)++;
**topo_ptr = unit_src_ptr;
unit_src_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} /*if*/
} /*FOR_ALL_LINKS*/
if (*no_of_units > 0) {
/* stop searching for reca unit */
break;
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_CmpUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_RecUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
bool is_reca_unit;
*no_of_units = 0;
/* properties of reca units:
- has no sites
- has incoming links from cmpa units
*/
FOR_ALL_UNITS (unit_ptr) {
if (IS_SPECIAL_UNIT (unit_ptr)) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
is_reca_unit = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_CMPa_LAY) {
is_reca_unit = TRUE;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
if (is_reca_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RECa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_RECa_LAY;
**topo_ptr = unit_ptr;
(*no_of_units)++;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_RecUnits_a */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_DelUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
struct Link *this_link = NULL;
int count_links;
int no_of_dela_units = 0;
bool got_d1a_unit = FALSE;
bool got_d2a_unit = FALSE;
bool got_d3a_unit = FALSE;
*no_of_units = 0;
/* the dela units each have got just one incoming link from their
corresponding reca unit. They don't have sites.
*/
FOR_ALL_UNITS (unit_ptr) {
if ((! (UNIT_REFRESHED (unit_ptr))) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
count_links = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
count_links++;
this_link = link_ptr;
} /*FOR_ALL_LINKS*/
if ((count_links == 1) && (this_link->to->lln == ARTMAP_RECa_LAY)) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_DELa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELa_LAY;
unit_ptr->lun = ARTMAP_DELa_REC_UNIT;
no_of_dela_units++;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
/* now we are looking for d1a which has to have links to all dela units
*/
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
count_links = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_DELa_REC_UNIT))
{
count_links ++;
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_links == no_of_dela_units) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Da))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELa_LAY;
unit_ptr->lun = ARTMAP_D1a_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d1a_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* Now we can break the search, 'cause we got the d1a unit */
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*FOR_ALL_UNITS*/
if (!got_d1a_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: d1 (=d1a)");
} /*if*/
/* Now we are looking for the d2a unit */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_D1a_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Da))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELa_LAY;
unit_ptr->lun = ARTMAP_D2a_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d2a_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* we can break the search for the d2a unit */
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_d2a_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: d2 (=d2a)");
} /*if*/
/* Now we are looking for the d3a unit */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_D2a_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Da))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELa_LAY;
unit_ptr->lun = ARTMAP_D3a_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d3a_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* we can break the search for the d3a unit */
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_d3a_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: d3 (=d3a)");
} /*if*/
*no_of_units = no_of_dela_units + 3;
return (ret_code);
} /* kram_get_DelUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_RstUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
bool has_link_to_itself,
has_link_to_dela_unit;
/* each rsta unit has got sites, a link to itself, one from a dela unit
and one from the rga unit which wasn't determined yet.
*/
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_SITES (unit_ptr))) {
has_link_to_itself = FALSE;
has_link_to_dela_unit = FALSE;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to == unit_ptr) {
has_link_to_itself = TRUE;
} /*if*/
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_DELa_REC_UNIT)
)
{
has_link_to_dela_unit = TRUE;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if (has_link_to_itself && has_link_to_dela_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RSTa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_RSTa_LAY;
(*no_of_units)++;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_RstUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_SpecUnits_a (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
TopoPtrArray topo_spec_ptr = *topo_ptr;
bool got_g1a_unit = FALSE;
bool got_ria_unit = FALSE;
bool got_rca_unit = FALSE;
bool got_rga_unit = FALSE;
bool got_cla_unit = FALSE;
bool got_nca_unit = FALSE;
bool got_rhoa_unit = FALSE;
bool got_g2a_unit = FALSE;
bool links_to_rsta_units,
links_to_d3a_unit,
links_to_reca_units,
links_to_cmpa_units,
links_to_inpa_units;
*no_of_units = 0;
/* looking for special units of ARTa */
FOR_ALL_UNITS (unit_ptr) {
if ( (!(UNIT_REFRESHED (unit_ptr))) &&
(!got_g1a_unit || !got_ria_unit || !got_rca_unit ||
!got_cla_unit || !got_nca_unit || !got_g2a_unit
)
)
{
if (UNIT_HAS_SITES (unit_ptr)) {
/* if a unit with sites does have links from inpa units
and reca units this can only be the g1a unit
*/
links_to_reca_units = FALSE;
links_to_inpa_units = FALSE;
links_to_cmpa_units = FALSE;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECa_LAY:
links_to_reca_units = TRUE;
break;
case ARTMAP_INPa_LAY:
links_to_inpa_units = TRUE;
break;
case ARTMAP_CMPa_LAY:
links_to_cmpa_units = TRUE;
break;
} /*switch*/
if ((links_to_reca_units && links_to_inpa_units) ||
(links_to_reca_units && !links_to_cmpa_units)
)
{
/* we found the g1a or the ria unit */
break;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if (links_to_reca_units && links_to_inpa_units) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_G1a))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_G1a_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 2) = unit_ptr;
got_g1a_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} else {
if (links_to_inpa_units && !links_to_cmpa_units) {
/* if there are links to the inpa units but none to the
reca units then we found the ria unit
*/
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RIa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_RIa_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 3) = unit_ptr;
got_ria_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} /*if*/
} /*if*/
} else {
/* unit has direct inputs */
links_to_rsta_units = FALSE;
links_to_d3a_unit = FALSE;
links_to_cmpa_units = FALSE;
links_to_inpa_units = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_INPa_LAY:
links_to_inpa_units = TRUE;
break;
case ARTMAP_CMPa_LAY:
links_to_cmpa_units = TRUE;
break;
case ARTMAP_DELa_LAY:
if (link_ptr->to->lun == ARTMAP_D3a_UNIT) {
links_to_d3a_unit = TRUE;
} /*if*/
break;
case ARTMAP_RSTa_LAY:
links_to_rsta_units = TRUE;
break;
} /*switch*/
} /*FOR_ALL_LINKS*/
if (links_to_inpa_units && !got_g2a_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_G2a))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_G2a_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 7) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_g2a_unit = TRUE;
continue;
} /*if*/
if (links_to_cmpa_units && !links_to_inpa_units &&
!got_rca_unit
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RCa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_RCa_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 4) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rca_unit = TRUE;
continue;
} /*if*/
if (links_to_d3a_unit && !got_cla_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_CLa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_CLa_UNIT;
(*no_of_units)++;
*topo_spec_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_cla_unit = TRUE;
continue;
} /*if*/
if (links_to_rsta_units && !links_to_cmpa_units &&
!got_nca_unit
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_NCa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_NCa_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 1) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_nca_unit = TRUE;
continue;
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
/* the rga and the rhoa unit remain to be determined */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr))) {
/* looking for rga unit */
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_SPECa_LAY) &&
(link_ptr->to->lun == ARTMAP_RIa_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RGa))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
/* this is the rga unit */
unit_ptr->lln = ARTMAP_SPECa_LAY;
unit_ptr->lun = ARTMAP_RGa_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 5) = unit_ptr;
got_rga_unit =TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} else {
/* looking for rhoa unit via ria */
if ((unit_ptr->lln == ARTMAP_SPECa_LAY) &&
(unit_ptr->lun == ARTMAP_RIa_UNIT)
)
{
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_INPa_LAY) {
if (!(CHECK_ACT_FUNC (link_ptr->to, ARTMAP_ACTF_RHOa))) {
TOPO_MSG_ACT_FUNC (link_ptr->to);
} /*if*/
if (!(CHECK_OUT_FUNC (link_ptr->to, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (link_ptr->to);
} /*if*/
/* the link_ptr->to unit is the rhoa unit */
link_ptr->to->lln = ARTMAP_SPECa_LAY;
link_ptr->to->lun = ARTMAP_RHOa_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 6) = link_ptr->to;
(*topo_ptr)++;
got_rhoa_unit = TRUE;
link_ptr->to->flags |= UFLAG_REFRESH;
break;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
} /*if*/
} /*if*/
if (got_rga_unit && got_rhoa_unit) {
break;
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_cla_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: cl (=cla)");
} /*if*/
if (!got_nca_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: nc (=nca)");
} /*if*/
if (!got_ria_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: ri (=ria)");
} /*if*/
if (!got_rca_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: rc (=rca)");
} /*if*/
if (!got_rga_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: rg (=rga)");
} /*if*/
if (!got_g1a_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: g1 (=g1a)");
} /*if*/
if (!got_rhoa_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: rho (=rhoa)");
} /*if*/
if (!got_g2a_unit) {
TOPO_MSG_UNIT_MISSING ("ARTa: g2 (=g2a)");
} /*if*/
return (ret_code);
} /* kram_get_SpecUnits_a () */
/*___________________________________________________________________________*/
/*************** functions to determine units of ARTb
***************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_InpUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_src_ptr, *unit_trg_ptr;
register struct Site *site_trg_ptr;
register struct Link *link_trg_ptr;
int count_links;
/* for the inpb units it is characteristical that they have got 2
links to other units while the ones of ARTa have 3
*/
*no_of_units = 0;
FOR_ALL_UNITS (unit_src_ptr) {
if (IS_INPUT_UNIT (unit_src_ptr)) {
if (UNIT_HAS_INPUTS (unit_src_ptr)) {
topo_msg.error_code = KRERR_I_UNITS_CONNECT;
topo_msg.dest_error_unit = unit_src_ptr-unit_array;
topo_msg.src_error_unit = 0;
return (topo_msg.error_code);
} /*if*/
count_links = 0;
FOR_ALL_UNITS (unit_trg_ptr) {
if (UNIT_HAS_SITES (unit_trg_ptr)) {
FOR_ALL_SITES_AND_LINKS (unit_trg_ptr, site_trg_ptr, link_trg_ptr) {
if (link_trg_ptr->to == unit_src_ptr) {
count_links++;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
} else {
FOR_ALL_LINKS (unit_trg_ptr, link_trg_ptr) {
if (link_trg_ptr->to == unit_src_ptr) {
count_links++;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (count_links == 4) {
if (!(CHECK_ACT_FUNC (unit_src_ptr, ARTMAP_ACTF_INPb))) {
TOPO_MSG_ACT_FUNC (unit_src_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_src_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_src_ptr);
} /*if*/
(*no_of_units)++;
**topo_ptr = unit_src_ptr;
unit_src_ptr->lln = ARTMAP_INPb_LAY;
(*topo_ptr)++;
unit_src_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_InpUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_CmpUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
struct Unit *unit_src_ptr;
register struct Link *link_ptr;
struct Link *link_src_ptr;
bool is_cmpb_unit;
bool has_link_to_inpb;
bool has_link_to_other_than_inpb;
*no_of_units = 0;
/* look for a recb unit */
FOR_ALL_UNITS (unit_ptr) {
if (!IS_SPECIAL_UNIT (unit_ptr)) {
continue;
} /*if*/
/* the recognition unit is not supposed to have sites
*/
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
/* unit_ptr points to a recogniton unit.
we follow the incoming links of this unit. if the source unit we
got by doing this has the following properties, this is a comparison
unit of ARTb
- has no sites
- has incoming link from inpb unit
*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
unit_src_ptr = link_ptr->to;
is_cmpb_unit = FALSE;
has_link_to_inpb = FALSE;
has_link_to_other_than_inpb = FALSE;
if (UNIT_HAS_DIRECT_INPUTS (unit_src_ptr)) {
FOR_ALL_LINKS (unit_src_ptr, link_src_ptr) {
if (link_src_ptr->to->lln == ARTMAP_INPb_LAY) {
has_link_to_inpb = TRUE;
} else {
has_link_to_other_than_inpb = TRUE;
} /*if*/
if (has_link_to_inpb && has_link_to_other_than_inpb) {
is_cmpb_unit = TRUE;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
if (is_cmpb_unit) {
if (!(CHECK_ACT_FUNC (unit_src_ptr, ARTMAP_ACTF_CMPb))) {
TOPO_MSG_ACT_FUNC (unit_src_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_src_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_src_ptr);
} /*if*/
unit_src_ptr->lln = ARTMAP_CMPb_LAY;
(*no_of_units)++;
**topo_ptr = unit_src_ptr;
unit_src_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} /*if*/
} /*FOR_ALL_LINKS*/
if (*no_of_units > 0) {
/* stop searching for reca unit */
break;
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_CmpUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_RecUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
bool is_recb_unit;
*no_of_units = 0;
/* properties of recb units:
- has no sites
- has incoming links from cmpb units
*/
FOR_ALL_UNITS (unit_ptr) {
if (IS_SPECIAL_UNIT (unit_ptr)) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
is_recb_unit = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_CMPb_LAY) {
is_recb_unit = TRUE;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
if (is_recb_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RECb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_RECb_LAY;
**topo_ptr = unit_ptr;
(*no_of_units)++;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_RecUnits_b */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_DelUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_links;
int no_of_delb_units = 0;
bool has_link_to_recb_unit;
bool got_d1b_unit = FALSE;
bool got_d2b_unit = FALSE;
bool got_d3b_unit = FALSE;
*no_of_units = 0;
/* the delb units each have got just two incoming links, one of which
is from their corresponding reca unit. They don't have sites.
*/
FOR_ALL_UNITS (unit_ptr) {
if ((! (UNIT_REFRESHED (unit_ptr))) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
count_links = 0;
has_link_to_recb_unit = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
count_links++;
if (link_ptr->to->lln == ARTMAP_RECb_LAY) {
has_link_to_recb_unit = TRUE;
} /*if*/
} /*FOR_ALL_LINKS*/
if ((count_links == 2) && (has_link_to_recb_unit)) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_DELb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELb_LAY;
unit_ptr->lun = ARTMAP_DELb_REC_UNIT;
no_of_delb_units++;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
/* now we are looking for d1b which has to have links to all delb units
*/
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
count_links = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_DELb_REC_UNIT))
{
count_links ++;
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_links == no_of_delb_units) {
/* in this case we don't really check the Activation and
output function, we use it to detemine the correct unit
(d1b) 'cause the d1 unit has the same properties as
d1b except its activation function.
*/
if ((CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Db)) &&
(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))
)
{
unit_ptr->lln = ARTMAP_DELb_LAY;
unit_ptr->lun = ARTMAP_D1b_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d1b_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* Now we can break the search, 'cause we got the d1b unit */
break;
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_d1b_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: d1 (=d1b)");
} /*if*/
/* Now we are looking for the d2b unit */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_D1b_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Db))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELb_LAY;
unit_ptr->lun = ARTMAP_D2b_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d2b_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* we can break the search for the d2b unit */
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_d2b_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: d2 (=d2b)");
} /*if*/
/* Now we are looking for the d3b unit */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_D2b_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_Db))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_DELb_LAY;
unit_ptr->lun = ARTMAP_D3b_UNIT;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
got_d3b_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
/* we can break the search for the d3b unit */
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_d3b_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: d3 (=d3b)");
} /*if*/
*no_of_units = no_of_delb_units + 3;
return (ret_code);
} /* kram_get_DelUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_RstUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
bool has_link_to_itself,
has_link_to_delb_unit;
/* each rstb unit has got sites, a link to itself, one from a delb unit
and one from the rgb unit which wasn't determined yet.
*/
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_SITES (unit_ptr))) {
has_link_to_itself = FALSE;
has_link_to_delb_unit = FALSE;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to == unit_ptr) {
has_link_to_itself = TRUE;
} /*if*/
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_DELb_REC_UNIT)
)
{
has_link_to_delb_unit = TRUE;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if (has_link_to_itself && has_link_to_delb_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RSTb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_RSTb_LAY;
(*no_of_units)++;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_RstUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_SpecUnits_b (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
TopoPtrArray topo_spec_ptr = *topo_ptr;
bool got_g1b_unit = FALSE;
bool got_rib_unit = FALSE;
bool got_rcb_unit = FALSE;
bool got_rgb_unit = FALSE;
bool got_clb_unit = FALSE;
bool got_ncb_unit = FALSE;
bool got_rhob_unit = FALSE;
bool got_g2b_unit = FALSE;
bool links_to_rstb_units,
links_to_d3b_unit,
links_to_recb_units,
links_to_cmpb_units,
links_to_inpb_units;
*no_of_units = 0;
/* looking for special units of ARTb */
FOR_ALL_UNITS (unit_ptr) {
if ( (!(UNIT_REFRESHED (unit_ptr))) &&
(!got_g1b_unit || !got_rib_unit || !got_rcb_unit ||
!got_clb_unit || !got_ncb_unit || !got_g2b_unit
)
)
{
if (UNIT_HAS_SITES (unit_ptr)) {
/* if a unit with sites does have links from inpb units
and recb units this can only be the g1b unit
*/
links_to_recb_units = FALSE;
links_to_inpb_units = FALSE;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_RECb_LAY) {
links_to_recb_units = TRUE;
} /*if*/
if (link_ptr->to->lln == ARTMAP_INPb_LAY) {
links_to_inpb_units = TRUE;
} /*if*/
if (links_to_inpb_units) {
/* we found the g1b unit */
break;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if (links_to_recb_units && links_to_inpb_units) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_G1b))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_G1b_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 2) = unit_ptr;
got_g1b_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} else {
if (links_to_inpb_units) {
/* if there are links to the inpb units but none to the
recb units then we found the rib unit
*/
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RIb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_RIb_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 3) = unit_ptr;
got_rib_unit = TRUE;
unit_ptr->flags |= UFLAG_REFRESH;
(*topo_ptr)++;
} /*if*/
} /*if*/
} else {
/* unit has direct inputs */
links_to_rstb_units = FALSE;
links_to_d3b_unit = FALSE;
links_to_cmpb_units = FALSE;
links_to_inpb_units = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_INPb_LAY:
links_to_inpb_units = TRUE;
break;
case ARTMAP_CMPb_LAY:
links_to_cmpb_units = TRUE;
break;
case ARTMAP_DELb_LAY:
if (link_ptr->to->lun == ARTMAP_D3b_UNIT) {
links_to_d3b_unit = TRUE;
} /*if*/
break;
case ARTMAP_RSTb_LAY:
links_to_rstb_units = TRUE;
break;
} /*switch*/
} /*FOR_ALL_LINKS*/
if (links_to_inpb_units && !got_g2b_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_G2b))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_G2b_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 7) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_g2b_unit = TRUE;
continue;
} /*if*/
if (links_to_cmpb_units && !links_to_inpb_units &&
!got_rcb_unit
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RCb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_RCb_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 4) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rcb_unit = TRUE;
continue;
} /*if*/
if (links_to_d3b_unit && !got_clb_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_CLb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_CLb_UNIT;
(*no_of_units)++;
*topo_spec_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_clb_unit = TRUE;
continue;
} /*if*/
if (links_to_rstb_units && !links_to_cmpb_units &&
!got_ncb_unit
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_NCb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_NCb_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 1) = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_ncb_unit = TRUE;
continue;
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
/* the rgb and the rhob unit remain to be determined */
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr))) {
/* looking for rgb unit */
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_SPECb_LAY) &&
(link_ptr->to->lun == ARTMAP_RIb_UNIT)
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RGb))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
/* this is the rgb unit */
unit_ptr->lln = ARTMAP_SPECb_LAY;
unit_ptr->lun = ARTMAP_RGb_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 5) = unit_ptr;
got_rgb_unit =TRUE;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
break;
} /*if*/
} /*FOR_ALL_LINKS*/
} /*if*/
} else {
/* looking for rhob unit via ria */
if ((unit_ptr->lln == ARTMAP_SPECb_LAY) &&
(unit_ptr->lun == ARTMAP_RIb_UNIT)
)
{
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_INPb_LAY) {
if (!(CHECK_ACT_FUNC (link_ptr->to, ARTMAP_ACTF_RHOb))) {
TOPO_MSG_ACT_FUNC (link_ptr->to);
} /*if*/
if (!(CHECK_OUT_FUNC (link_ptr->to, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (link_ptr->to);
} /*if*/
/* the link_ptr->to unit is the rhoa unit */
/* the link_ptr->to unit is the rhob unit */
link_ptr->to->lln = ARTMAP_SPECb_LAY;
link_ptr->to->lun = ARTMAP_RHOb_UNIT;
(*no_of_units)++;
*(topo_spec_ptr + 6) = link_ptr->to;
(*topo_ptr)++;
got_rhob_unit = TRUE;
link_ptr->to->flags |= UFLAG_REFRESH;
break;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
} /*if*/
} /*if*/
if (got_rgb_unit && got_rhob_unit) {
break;
} /*if*/
} /*FOR_ALL_UNITS*/
if (!got_clb_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: cl (=clb)");
} /*if*/
if (!got_ncb_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: nc (=ncb)");
} /*if*/
if (!got_rib_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: ri (=rib)");
} /*if*/
if (!got_rcb_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: rc (=rcb)");
} /*if*/
if (!got_rgb_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: rg (=rgb)");
} /*if*/
if (!got_g1b_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: g1 (=g1b)");
} /*if*/
if (!got_rhob_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: rho (=rhob)");
} /*if*/
if (!got_g2b_unit) {
TOPO_MSG_UNIT_MISSING ("ARTb: g2 (=g2b)");
} /*if*/
return (ret_code);
} /* kram_get_SpecUnits_b () */
/*___________________________________________________________________________*/
/*************** functions to determine units of map field of ARTMAP net
***************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_MapUnits (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
bool has_link_to_dela_unit,
has_link_to_delb_unit;
*no_of_units = 0;
/* looking for map units. These units have got incoming
links from the dela units and the delb units. They have
no sites.
*/
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr)) && (UNIT_HAS_DIRECT_INPUTS (unit_ptr))) {
has_link_to_dela_unit = FALSE;
has_link_to_delb_unit = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_DELa_LAY) {
has_link_to_dela_unit = TRUE;
continue;
} /*if*/
if (link_ptr->to->lln == ARTMAP_DELb_LAY) {
has_link_to_delb_unit = TRUE;
continue;
} /*if*/
if (has_link_to_dela_unit && has_link_to_delb_unit) {
break;
} /*if*/
} /*FOR_ALL_LINKS*/
if (has_link_to_dela_unit && has_link_to_delb_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_MAP))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_MAP_LAY;
(*no_of_units)++;
**topo_ptr = unit_ptr;
(*topo_ptr)++;
unit_ptr->flags |= UFLAG_REFRESH;
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_get_MapUnits () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_get_SpecUnits (TopoPtrArray *topo_ptr, int *no_of_units)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
TopoPtrArray topo_spec_ptr = *topo_ptr;
bool has_links_to_reca_units,
has_links_to_inpa_units,
has_link_to_cla_unit,
has_link_to_nca_unit,
has_link_to_itself,
has_links_to_map_units,
has_link_to_rhoa_unit,
has_link_to_delb_unit,
has_link_to_rga_unit;
bool got_d1_unit = FALSE;
bool got_cl_unit = FALSE;
bool got_nc_unit = FALSE;
bool got_G_unit = FALSE;
bool got_rb_unit = FALSE;
bool got_rm_unit = FALSE;
bool got_rg_unit = FALSE;
bool got_rho_unit = FALSE;
bool got_qu_unit = FALSE;
bool got_drho_unit = FALSE;
FOR_ALL_UNITS (unit_ptr) {
if (!(UNIT_REFRESHED (unit_ptr))) {
if (UNIT_HAS_SITES (unit_ptr)) {
/* G, rb or qu unit */
has_links_to_reca_units = FALSE;
has_links_to_inpa_units = FALSE;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECa_LAY:
has_links_to_reca_units = TRUE;
break;
case ARTMAP_INPa_LAY:
has_links_to_inpa_units = TRUE;
break;
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if (has_links_to_reca_units && !got_G_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_G))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
/* This is the G unit */
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_G_UNIT;
*(topo_spec_ptr + 3) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_G_unit = TRUE;
continue;
} /*if*/
if (has_links_to_inpa_units && !got_qu_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_QU))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
/* This is the qu unit */
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_QU_UNIT;
*(topo_spec_ptr + 8) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_qu_unit = TRUE;
continue;
} /*if*/
if (!got_rb_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RB))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
/* This is the rb unit */
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_RB_UNIT;
*(topo_spec_ptr + 4) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rb_unit = TRUE;
} /*if*/
} else {
/* unit has no sites, so this is the cl, nc, rho, rm,
drho or rg unit
*/
has_link_to_cla_unit = FALSE;
has_link_to_nca_unit = FALSE;
has_link_to_itself = FALSE;
has_links_to_map_units = FALSE;
has_link_to_rhoa_unit = FALSE;
has_link_to_delb_unit = FALSE;
has_link_to_rga_unit = FALSE;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPECa_LAY :
switch (link_ptr->to->lun) {
case ARTMAP_CLa_UNIT:
has_link_to_cla_unit = TRUE;
break;
case ARTMAP_NCa_UNIT:
has_link_to_nca_unit = TRUE;
break;
case ARTMAP_RHOa_UNIT:
has_link_to_rhoa_unit = TRUE;
break;
case ARTMAP_RGa_UNIT:
has_link_to_rga_unit = TRUE;
break;
} /*switch*/
break;
case ARTMAP_MAP_LAY:
has_links_to_map_units = TRUE;
break;
case ARTMAP_DELb_LAY:
has_link_to_delb_unit = TRUE;
break;
default:
if (link_ptr->to == unit_ptr) {
has_link_to_itself = TRUE;
} /*if*/
} /*switch*/
} /*FOR_ALL_LINKS*/
if (has_link_to_cla_unit && !got_cl_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_CL))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_CL_UNIT;
ArtMap_cl_unit = unit_ptr;
*(topo_spec_ptr + 1) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_cl_unit = TRUE;
continue;
} /*if*/
if (has_link_to_nca_unit && !got_nc_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_NC))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_NC_UNIT;
ArtMap_nc_unit = unit_ptr;
*(topo_spec_ptr + 2) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_nc_unit = TRUE;
continue;
} /*if*/
if (has_link_to_itself && !got_rho_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RHO))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_RHO_UNIT;
*(topo_spec_ptr + 7) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rho_unit = TRUE;
continue;
} /*if*/
if (has_links_to_map_units && !got_rm_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RM))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_RM_UNIT;
*(topo_spec_ptr + 5) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rm_unit = TRUE;
continue;
} /*if*/
if (has_link_to_rga_unit && has_link_to_rhoa_unit &&
! got_drho_unit
)
{
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_DRHO))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_DRHO_UNIT;
*(topo_spec_ptr + 9) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_drho_unit = TRUE;
continue;
} /*if*/
if (has_link_to_delb_unit && !got_d1_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_D1))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_D1_UNIT;
*topo_spec_ptr = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_d1_unit = TRUE;
continue;
} /*if*/
if (!got_rg_unit) {
if (!(CHECK_ACT_FUNC (unit_ptr, ARTMAP_ACTF_RG))) {
TOPO_MSG_ACT_FUNC (unit_ptr);
} /*if*/
if (!(CHECK_OUT_FUNC (unit_ptr, ARTMAP_OUTFUNC))) {
TOPO_MSG_OUT_FUNC (unit_ptr);
} /*if*/
unit_ptr->lln = ARTMAP_SPEC_LAY;
unit_ptr->lun = ARTMAP_RG_UNIT;
*(topo_spec_ptr + 6) = unit_ptr;
(*topo_ptr)++;
(*no_of_units)++;
unit_ptr->flags |= UFLAG_REFRESH;
got_rg_unit = TRUE;
} /*if*/
} /*if (UNIT_HAS_SITES)*/
} /* if (!UNIT_REFRESHED)*/
} /*FOR_ALL_UNITS*/
if (!got_cl_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: cl");
} /*if*/
if (!got_nc_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: nc");
} /*if*/
if (!got_rb_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: rb");
} /*if*/
if (!got_rm_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: rm");
} /*if*/
if (!got_rg_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: rg");
} /*if*/
if (!got_G_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: G");
} /*if*/
if (!got_d1_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: d1");
} /*if*/
if (!got_rho_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: rho");
} /*if*/
if (!got_qu_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: qu");
} /*if*/
if (!got_drho_unit) {
TOPO_MSG_UNIT_MISSING ("MAP: drho");
} /*if*/
return (ret_code);
} /* kram_get_SpecUnits */
/*___________________________________________________________________________*/
/**************** funciton for checking topo ptr array of ARTMAP net
****************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_TopoPtrArray (void)
{
TopoPtrArray topo_inpa_cmpa_sep,
topo_cmpa_reca_sep,
topo_reca_dela_sep,
topo_dela_rsta_sep,
topo_rsta_speca_sep,
topo_speca_inpb_sep,
topo_inpb_cmpb_sep,
topo_cmpb_recb_sep,
topo_recb_delb_sep,
topo_delb_rstb_sep,
topo_rstb_specb_sep,
topo_specb_map_sep,
topo_map_spec_sep,
topo_ptr_array_end;
int ret_code = KRERR_NO_ERROR;
topo_inpa_cmpa_sep = topo_ptr_array + ArtMap_NoOfInpUnits_a + 1;
topo_cmpa_reca_sep = topo_inpa_cmpa_sep + ArtMap_NoOfInpUnits_a + 1;
topo_reca_dela_sep = topo_cmpa_reca_sep + ArtMap_NoOfRecUnits_a + 1;
topo_dela_rsta_sep = topo_reca_dela_sep + ArtMap_NoOfRecUnits_a + 4;
topo_rsta_speca_sep = topo_dela_rsta_sep + ArtMap_NoOfRecUnits_a + 1;
topo_speca_inpb_sep = topo_rsta_speca_sep + ARTMAP_NO_OF_SPECa_UNITS + 1;
topo_inpb_cmpb_sep = topo_speca_inpb_sep + ArtMap_NoOfInpUnits_b + 1;
topo_cmpb_recb_sep = topo_inpb_cmpb_sep + ArtMap_NoOfInpUnits_b + 1;
topo_recb_delb_sep = topo_cmpb_recb_sep + ArtMap_NoOfRecUnits_b + 1;
topo_delb_rstb_sep = topo_recb_delb_sep + ArtMap_NoOfRecUnits_b + 4;
topo_rstb_specb_sep = topo_delb_rstb_sep + ArtMap_NoOfRecUnits_b + 1;
topo_specb_map_sep = topo_rstb_specb_sep + ARTMAP_NO_OF_SPECb_UNITS + 1;
topo_map_spec_sep = topo_specb_map_sep + ArtMap_NoOfRecUnits_b + 1;
topo_ptr_array_end = topo_map_spec_sep + ARTMAP_NO_OF_SPEC_UNITS + 1;
if ((*topo_ptr_array != NULL) ||
(*topo_inpa_cmpa_sep != NULL) ||
(*topo_cmpa_reca_sep != NULL) ||
(*topo_reca_dela_sep != NULL) ||
(*topo_dela_rsta_sep != NULL) ||
(*topo_rsta_speca_sep != NULL) ||
(*topo_speca_inpb_sep != NULL) ||
(*topo_inpb_cmpb_sep != NULL) ||
(*topo_cmpb_recb_sep != NULL) ||
(*topo_recb_delb_sep != NULL) ||
(*topo_delb_rstb_sep != NULL) ||
(*topo_rstb_specb_sep != NULL) ||
(*topo_specb_map_sep != NULL) ||
(*topo_map_spec_sep != NULL) ||
(*topo_ptr_array_end != NULL) ||
(*(topo_ptr_array_end+1) != NULL)
)
{
ARTMAP_RETURN_NET_ERROR (ret_code);
} /*if*/
return (ret_code);
} /* kram_TopoPtrArray */
/*___________________________________________________________________________*/
/****************** function for checking sites of ARTMAP network
******************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_Sites (void)
{
register struct Unit *unit_ptr;
register struct Site *site_ptr;
TopoPtrArray topo_rsta_ptr,
topo_g1a_ptr,
topo_ria_ptr,
topo_rstb_ptr,
topo_g1b_ptr,
topo_rib_ptr,
topo_G_ptr,
topo_rb_ptr,
topo_qu_ptr;
bool got_site1,
got_site2;
krui_err ret_code = KRERR_NO_ERROR;
topo_rsta_ptr = topo_ptr_array + 2*ArtMap_NoOfInpUnits_a +
2*ArtMap_NoOfRecUnits_a + 8;
topo_g1a_ptr = topo_rsta_ptr + ArtMap_NoOfRecUnits_a + 3;
topo_ria_ptr = topo_g1a_ptr + 1;
topo_rstb_ptr = topo_ria_ptr + 5 + 2*ArtMap_NoOfInpUnits_b +
2*ArtMap_NoOfRecUnits_b + 8;
topo_g1b_ptr = topo_rstb_ptr + ArtMap_NoOfRecUnits_b + 3;
topo_rib_ptr = topo_g1b_ptr + 1;
topo_G_ptr = topo_rib_ptr + 5 + ArtMap_NoOfRecUnits_b + 5;
topo_rb_ptr = topo_G_ptr + 1;
topo_qu_ptr = topo_rb_ptr + 4;
/* check sites of local reset units of ARTa
*/
while ((unit_ptr = *topo_rsta_ptr++) != NULL) {
got_site1 = FALSE;
got_site2 = FALSE;
if (UNIT_HAS_SITES (unit_ptr)) {
FOR_ALL_SITES (unit_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RSTa_SELF)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RSTa_SIGNAL)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (unit_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (unit_ptr);
} /*if*/
} else {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
} /*while*/
/* Check sites of unit Gain 1 of ARTa */
if (UNIT_HAS_DIRECT_INPUTS (*topo_g1a_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_g1a_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_g1a_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_INPa_G1a)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RECa_G1a)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (*topo_g1a_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_g1a_ptr);
} /*if*/
/* Check sites of unit RIa */
if (UNIT_HAS_DIRECT_INPUTS (*topo_ria_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_ria_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_ria_ptr, site_ptr) {
if (CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RIa)) {
if (!got_site1) {
got_site1 = TRUE;
} else {
if (!got_site2) {
got_site2 = TRUE;
} else {
TOPO_MSG_SITE_FUNC (*topo_ria_ptr);
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_ria_ptr);
} /*if*/
/* check sites of local reset units of ARTb
*/
while ((unit_ptr = *topo_rstb_ptr++) != NULL) {
got_site1 = FALSE;
got_site2 = FALSE;
if (UNIT_HAS_SITES (unit_ptr)) {
FOR_ALL_SITES (unit_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RSTb_SELF)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RSTb_SIGNAL)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (unit_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (unit_ptr);
} /*if*/
} else {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
} /*while*/
/* Check sites of unit Gain 1 of ARTb */
if (UNIT_HAS_DIRECT_INPUTS (*topo_g1b_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_g1b_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_g1b_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_INPb_G1b)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RECb_G1b)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (*topo_g1b_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_g1b_ptr);
} /*if*/
/* Check sites of unit RIb */
if (UNIT_HAS_DIRECT_INPUTS (*topo_rib_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_rib_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_rib_ptr, site_ptr) {
if (CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RIb)) {
if (!got_site1) {
got_site1 = TRUE;
} else {
if (!got_site2) {
got_site2 = TRUE;
} else {
TOPO_MSG_SITE_FUNC (*topo_rib_ptr);
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_rib_ptr);
} /*if*/
/* Check sites of unit G */
if (UNIT_HAS_DIRECT_INPUTS (*topo_G_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_G_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_G_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_ARTa_G)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_ARTb_G)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (*topo_G_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_G_ptr);
} /*if*/
/* Check sites of unit rb */
if (UNIT_HAS_DIRECT_INPUTS (*topo_rb_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_rb_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_rb_ptr, site_ptr) {
if (CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_RB)) {
if (!got_site1) {
got_site1 = TRUE;
} else {
if (!got_site2) {
got_site2 = TRUE;
} else {
TOPO_MSG_SITE_FUNC (*topo_rb_ptr);
} /*if*/
} /*if*/
} /*if*/
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_rb_ptr);
} /*if*/
/* Check sites of unit qu */
if (UNIT_HAS_DIRECT_INPUTS (*topo_qu_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (*topo_qu_ptr);
} /*if*/
got_site1 = FALSE;
got_site2 = FALSE;
FOR_ALL_SITES (*topo_qu_ptr, site_ptr) {
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_CMPa_QU)) && (!got_site1)) {
got_site1 = TRUE;
continue;
} /*if*/
if ((CHECK_SITE_FUNC (site_ptr, ARTMAP_SITEF_INPa_QU)) && (!got_site2)) {
got_site2 = TRUE;
continue;
} /*if*/
TOPO_MSG_SITE_FUNC (*topo_qu_ptr);
} /*FOR_ALL_SITES*/
if (!got_site1 || !got_site2) {
TOPO_MSG_SITE_MISSING (*topo_qu_ptr);
} /*if*/
return (ret_code);
} /* kram_Sites () */
/*___________________________________________________________________________*/
/*#################### functions for checking links of ARTa
####################*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToInpUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
krui_err ret_code = KRERR_NO_ERROR;
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_INPUTS (unit_ptr)) {
topo_msg.error_code = KRERR_I_UNITS_CONNECT;
topo_msg.dest_error_unit = unit_ptr-unit_array;
topo_msg.src_error_unit = 0;
ret_code = topo_msg.error_code;
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToInpUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToCmpUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_inp,
count_spec,
count_del;
krui_err ret_code = KRERR_NO_ERROR;
/* - each comparison unit has a link to exactly one input unit which itself
is connected to only this comparison unit and no other.
- each comparison unit is linked to the gain 1 unit
- each comparison unit is linked to each delay unit that corresponds to
a recognition unit
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} else {
count_inp = 0;
count_spec = 0;
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_DELa_LAY:
if (link_ptr->to->lun == ARTMAP_DELa_REC_UNIT) {
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_INPa_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_inp++;
break;
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun != ARTMAP_G1a_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_spec++;
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_inp != 1) || (count_spec != 1) ||
(count_del != ArtMap_NoOfRecUnits_a)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToCmpUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToRecUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_cmp;
int count_rst;
int count_rg;
int count_g2;
krui_err ret_code = KRERR_NO_ERROR;
/* - each recognition unit is linked to all comparison units
- each recognition unit is linked to the reset general unit
- each recognition unit is linked to exactly one local reset unit which
itself is linked to only this recognition unit.
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} else {
count_cmp = 0;
count_rst = 0;
count_rg = 0;
count_g2 = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_CMPa_LAY:
count_cmp++;
break;
case ARTMAP_RSTa_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_rst++;
break;
case ARTMAP_SPECa_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_RGa_UNIT:
count_rg++;
break;
case ARTMAP_G2a_UNIT:
count_g2++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_rst != 1) || (count_rg != 1) || (count_g2 != 1) ||
(count_cmp != ArtMap_NoOfInpUnits_a)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToRecUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToDelUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_rec;
int count_del;
krui_err ret_code = KRERR_NO_ERROR;
/* There are different cases to distinguish
1. the delay unit is one that corresponds to a recogniton unit
then
- it has only one incoming link which comes from the corresponding
recognition unit
2. it is the first other delay unit then
- it has links to all delay units that correspond to a
recognition unit
3. it is the second other delay unit then
- it has exactly one link to the first other delay unit
4. it is the third other delay unit then
- it has exactly one link to the second other delay unit.
*/
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} else {
switch (unit_ptr->lun) {
case ARTMAP_DELa_REC_UNIT:
count_rec = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_RECa_LAY) {
count_rec++;
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} else {
link_ptr->to->flags |= UFLAG_REFRESH;
} /*if*/
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_rec != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D1a_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_DELa_REC_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != ArtMap_NoOfRecUnits_a) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D2a_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_D1a_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D3a_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELa_LAY) &&
(link_ptr->to->lun == ARTMAP_D2a_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
default :
ARTMAP_RETURN_NET_ERROR (ret_code);
} /* switch */
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToDelUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToRstUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
struct Site *site_ptr,
*site_ptr1,
*site_ptr2;
int count_rst;
int count_spec;
int count_del;
krui_err ret_code = KRERR_NO_ERROR;
/* - each local reset unit is linked to via site 1
- each local reset unit is linked to the reset general unit via site 2
- each local reset unit is linked to exactly one delay unit that
corresponds to a recognition unit and which itself is linked
to only this local reset unit, via site 2.
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} else {
count_rst = 0;
count_spec = 0;
count_del = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RSTa_LAY:
count_rst++;
if (link_ptr->to != unit_ptr) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_DELa_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_del++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun != ARTMAP_RGa_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_spec++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_rst != 1) || (count_spec != 1) || (count_del != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToRstUnits_a () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToSpecUnits_a (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
struct Site *site_ptr,
*site_ptr1,
*site_ptr2;
int count_rst;
int count_del;
int count_inp;
int count_rec;
int count_cmp;
int count_ri;
int count_rc;
int count_rg;
int count_rho;
int count_g2;
int count_drho;
krui_err ret_code = KRERR_NO_ERROR;
/* topo_ptr points to classified unit which has two links:
1. to d3a unit
2. to reset general unit
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_del = 0;
count_rg = 0;
count_g2 = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_DELa_LAY:
count_del++;
if (link_ptr->to->lun != ARTMAP_D3a_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECa_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_RGa_UNIT:
count_rg++;
break;
case ARTMAP_G2a_UNIT:
count_g2++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_del != 1) || (count_rg != 1) || count_g2 != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to not classifiable unit which is linked to all
local reset units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_rst = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_RSTa_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_rst++;
} /*FOR_ALL_LINKS*/
if (count_rst != ArtMap_NoOfRecUnits_a) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to Gain 1 unit which is linked to all input units
via site 1 and to all recognition units via site 2
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
count_inp = 0;
count_rec = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECa_LAY :
count_rec++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_INPa_LAY :
count_inp++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_inp != ArtMap_NoOfInpUnits_a) ||
(count_rec != ArtMap_NoOfRecUnits_a)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset I unit which is linked to all input units
via one site and to the RHO unit via the other site
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
count_inp = 0;
count_rho = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_INPa_LAY:
count_inp++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun != ARTMAP_RHOa_UNIT) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
count_rho++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr2 == site_ptr1) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_inp != ArtMap_NoOfInpUnits_a) || (count_rho != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset C unit which is linked to all comparison units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_cmp = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_CMPa_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_cmp++;
} /*FOR_ALL_LINKS*/
if (count_cmp != ArtMap_NoOfInpUnits_a) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset general unit which is linked to
the reset I unit and the reset C unit
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_ri = 0;
count_rc = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_SPECa_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
if (link_ptr->to->lun == ARTMAP_RIa_UNIT) {
count_ri++;
continue;
} /*if*/
if (link_ptr->to->lun == ARTMAP_RCa_UNIT) {
count_rc++;
continue;
} /*if*/
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*FOR_ALL_LINKS*/
if ((count_ri != 1) || (count_rc != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to RHOa unit which has an incoming link
from itself and one from the drho unit.
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_rho = 0;
count_drho = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun == ARTMAP_RHOa_UNIT) {
count_rho++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPEC_LAY:
if (link_ptr->to->lun == ARTMAP_DRHO_UNIT) {
count_drho++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_rho != 1) || (count_drho != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to g2a unit which has incoming links
from all inpa units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_inp = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_INPa_LAY) {
count_inp++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_inp != ArtMap_NoOfInpUnits_a) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
(*topo_ptr)++; /* increment topo_ptr to next used position in array */
return (ret_code);
} /* kram_LinksToSpecUnits_a () */
/*___________________________________________________________________________*/
/************* functions for checking links of ARTb
*************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToInpUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
krui_err ret_code = KRERR_NO_ERROR;
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_INPUTS (unit_ptr)) {
topo_msg.error_code = KRERR_I_UNITS_CONNECT;
topo_msg.dest_error_unit = unit_ptr-unit_array;
topo_msg.src_error_unit = 0;
ret_code = topo_msg.error_code;
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToInpUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToCmpUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_inp,
count_spec,
count_del;
krui_err ret_code = KRERR_NO_ERROR;
/* - each comparison unit has a link to exactly one input unit which itself
is connected to only this comparison unit and no other.
- each comparison unit is linked to the gain 1 unit
- each comparison unit is linked to each delay unit that corresponds to
a recognition unit
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} else {
count_inp = 0;
count_spec = 0;
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_DELb_LAY:
if (link_ptr->to->lun == ARTMAP_DELb_REC_UNIT) {
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_INPb_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_inp++;
break;
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun != ARTMAP_G1b_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_spec++;
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_inp != 1) || (count_spec != 1) ||
(count_del != ArtMap_NoOfRecUnits_b)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToCmpUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToRecUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_cmp;
int count_rst;
int count_rg;
int count_g2;
krui_err ret_code = KRERR_NO_ERROR;
/* - each recognition unit is linked to all comparison units
- each recognition unit is linked to the reset general unit
- each recognition unit is linked to exactly one local reset unit which
itself is linked to only this recognition unit.
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} else {
count_cmp = 0;
count_rst = 0;
count_rg = 0;
count_g2 = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_CMPb_LAY:
count_cmp++;
break;
case ARTMAP_RSTb_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_rst++;
break;
case ARTMAP_SPECb_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_RGb_UNIT:
count_rg++;
break;
case ARTMAP_G2b_UNIT:
count_g2++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_rst != 1) || (count_rg != 1) || (count_g2 != 1) ||
(count_cmp != ArtMap_NoOfInpUnits_b)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToRecUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToDelUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_rec;
int count_del;
int count_map;
krui_err ret_code = KRERR_NO_ERROR;
/* There are different cases to distinguish
1. the delay unit is one that corresponds to a recogniton unit
then
- it has one incoming link which comes from the corresponding
recognition unit
- and one incoming link, which comes from the corresponding
map-unit.
2. it is the first other delay unit then
- it has links to all delay units that correspond to a
recognition unit
3. it is the second other delay unit then
- it has exactly one link to the first other delay unit
4. it is the third other delay unit then
- it has exactly one link to the second other delay unit.
*/
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
ARTMAP_RETURN_NET_ERROR (ret_code);
} else {
switch (unit_ptr->lun) {
case ARTMAP_DELb_REC_UNIT:
count_rec = 0;
count_map = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECb_LAY:
count_rec++;
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} else {
link_ptr->to->flags |= UFLAG_REFRESH;
} /*if*/
break;
case ARTMAP_MAP_LAY:
count_map++;
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} else {
link_ptr->to->flags |= UFLAG_REFRESH;
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_rec != 1) || (count_map != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D1b_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_DELb_REC_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D2b_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_D1b_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
case ARTMAP_D3b_UNIT:
count_del = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_D2b_UNIT)
)
{
count_del++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_del != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
break;
default :
ARTMAP_RETURN_NET_ERROR (ret_code);
} /* switch */
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToDelUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToRstUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
struct Site *site_ptr,
*site_ptr1,
*site_ptr2;
int count_rst;
int count_spec;
int count_del;
krui_err ret_code = KRERR_NO_ERROR;
/* - each local reset unit is linked to via site 1
- each local reset unit is linked to the reset general unit via site 2
- each local reset unit is linked to exactly one delay unit that
corresponds to a recognition unit and which itself is linked
to only this local reset unit, via site 2.
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} else {
count_rst = 0;
count_spec = 0;
count_del = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RSTb_LAY:
count_rst++;
if (link_ptr->to != unit_ptr) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_DELb_LAY:
if (UNIT_REFRESHED (link_ptr->to)) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
link_ptr->to->flags |= UFLAG_REFRESH;
count_del++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun != ARTMAP_RGb_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_spec++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_rst != 1) || (count_spec != 1) || (count_del != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToRstUnits_b () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToSpecUnits_b (TopoPtrArray *topo_ptr)
{
register struct Unit *unit_ptr;
register struct Link *link_ptr;
struct Site *site_ptr,
*site_ptr1,
*site_ptr2;
int count_rst;
int count_del;
int count_inp;
int count_rec;
int count_cmp;
int count_ri;
int count_rc;
int count_rg;
int count_rho;
int count_g2;
krui_err ret_code = KRERR_NO_ERROR;
/* topo_ptr points to classified unit which has two links:
1. to d3b unit
2. to reset general unit
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_del = 0;
count_rg = 0;
count_g2 = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_DELb_LAY:
count_del++;
if (link_ptr->to->lun != ARTMAP_D3b_UNIT) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECb_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_RGb_UNIT:
count_rg++;
break;
case ARTMAP_G2b_UNIT:
count_g2++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /* switch */
} /*FOR_ALL_LINKS*/
if ((count_del != 1) || (count_rg != 1) || (count_g2 != 1))
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to not classifiable unit which is linked to all
local reset units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_rst = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_RSTb_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_rst++;
} /*FOR_ALL_LINKS*/
if (count_rst != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to Gain 1 unit which is linked to all input units
via site 1 and to all recognition units via site 2
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
count_inp = 0;
count_rec = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECb_LAY :
count_rec++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_INPb_LAY :
count_inp++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_inp != ArtMap_NoOfInpUnits_b) ||
(count_rec != ArtMap_NoOfRecUnits_b)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset I unit which is linked to all input units
via one site and to the RHO unit via the other site
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
count_inp = 0;
count_rho = 0;
site_ptr1 = NULL;
site_ptr2 = NULL;
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_INPb_LAY:
count_inp++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun != ARTMAP_RHOb_UNIT) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
count_rho++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr2 == site_ptr1) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_inp != ArtMap_NoOfInpUnits_b) || (count_rho != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset C unit which is linked to all comparison units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_cmp = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_CMPb_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
count_cmp++;
} /*FOR_ALL_LINKS*/
if (count_cmp != ArtMap_NoOfInpUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to reset general unit which is linked to
the reset I unit and the reset C unit
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_ri = 0;
count_rc = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln != ARTMAP_SPECb_LAY) {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
if (link_ptr->to->lun == ARTMAP_RIb_UNIT) {
count_ri++;
continue;
} /*if*/
if (link_ptr->to->lun == ARTMAP_RCb_UNIT) {
count_rc++;
continue;
} /*if*/
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*FOR_ALL_LINKS*/
if ((count_ri != 1) || (count_rc != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to RHOb unit which has an incoming links
from itself
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_rho = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun == ARTMAP_RHOb_UNIT) {
count_rho++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if (count_rho != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* topo_ptr points to g2b unit which has incoming links
from all inpb units
*/
unit_ptr = *(*topo_ptr)++;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_inp = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_INPb_LAY) {
count_inp++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_inp != ArtMap_NoOfInpUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
(*topo_ptr)++; /* increment topo_ptr to next used position in array */
return (ret_code);
} /* kram_LinksToSpecUnits_b () */
/*___________________________________________________________________________*/
/*********** functions to check links of map field of ARTMAP net
***********/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToMapUnits (TopoPtrArray *topo_ptr)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Link *link_ptr;
int count_dela,
count_delb,
count_G;
/* - each map unit is linked to all dela units
- each map unit is linked to its corresponding delb unit
- each map unit is linked to the G unit
*/
krart_deleteTouchFlags();
while ((unit_ptr = *(*topo_ptr)++) != NULL) {
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
count_dela = 0;
count_delb = 0;
count_G = 0;
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_DELa_LAY:
if (link_ptr->to->lun == ARTMAP_DELa_REC_UNIT) {
count_dela++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_DELb_LAY:
if ((link_ptr->to->lun == ARTMAP_DELb_REC_UNIT) &&
(!UNIT_REFRESHED (link_ptr->to))
)
{
count_delb++;
link_ptr->to->flags |= UFLAG_REFRESH;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPEC_LAY:
if (link_ptr->to->lun == ARTMAP_G_UNIT) {
count_G++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_dela != ArtMap_NoOfRecUnits_a) ||
(count_delb != 1) || (count_G != 1)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
} /*while*/
return (ret_code);
} /* kram_LinksToMapUnits () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static krui_err kram_LinksToSpecUnits (TopoPtrArray *topo_ptr)
{
krui_err ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
struct Site *site_ptr1,
*site_ptr2;
register struct Link *link_ptr;
TopoPtrArray topo_d1_ptr,
topo_cl_ptr,
topo_nc_ptr,
topo_G_ptr,
topo_rb_ptr,
topo_rm_ptr,
topo_rg_ptr,
topo_rho_ptr,
topo_qu_ptr,
topo_drho_ptr;
int count_delb,
count_d1,
count_cla,
count_clb,
count_nca,
count_ncb,
count_reca,
count_recb,
count_map,
count_rb,
count_rho,
count_rm,
count_inpa,
count_cmpa,
count_qu,
count_rhoa,
count_drho,
count_rg,
count_rga;
/* let's set the special topo pointers
*/
topo_d1_ptr = *topo_ptr;
topo_cl_ptr = topo_d1_ptr + 1;
topo_nc_ptr = topo_cl_ptr + 1;
topo_G_ptr = topo_nc_ptr + 1;
topo_rb_ptr = topo_G_ptr + 1;
topo_rm_ptr = topo_rb_ptr + 1;
topo_rg_ptr = topo_rm_ptr + 1;
topo_rho_ptr = topo_rg_ptr + 1;
topo_qu_ptr = topo_rho_ptr + 1;
topo_drho_ptr = topo_qu_ptr + 1;
/* first we check the links to the d1 unit :
it has inputs from all delb units.
*/
count_delb = 0;
unit_ptr = *topo_d1_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if ((link_ptr->to->lln == ARTMAP_DELb_LAY) &&
(link_ptr->to->lun == ARTMAP_DELb_REC_UNIT)
)
{
count_delb++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_delb != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the cl unit
it has inputs from the cla, the clb unit and the rg unit
*/
count_cla = 0;
count_clb = 0;
count_rg = 0;
unit_ptr = *topo_cl_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun == ARTMAP_CLa_UNIT) {
count_cla++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun == ARTMAP_CLb_UNIT) {
count_clb++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPEC_LAY:
if (link_ptr->to->lun == ARTMAP_RG_UNIT) {
count_rg++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_cla != 1) || (count_clb != 1) || (count_rg != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links of the nc unit:
it has inputs from the nca and the ncb unit
*/
count_nca = 0;
count_ncb = 0;
unit_ptr = *topo_nc_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPECa_LAY:
if (link_ptr->to->lun == ARTMAP_NCa_UNIT) {
count_nca++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_SPECb_LAY:
if (link_ptr->to->lun == ARTMAP_NCb_UNIT) {
count_ncb++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_nca != 1) || (count_ncb != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the G unit
it has inputs from all reca to one of its sites and from the recb
units to the other site.
*/
count_reca = 0;
count_recb = 0;
unit_ptr = *topo_G_ptr;
site_ptr1 = NULL;
site_ptr2 = NULL;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_RECb_LAY :
count_recb++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_RECa_LAY :
count_reca++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_reca != ArtMap_NoOfRecUnits_a) ||
(count_recb != ArtMap_NoOfRecUnits_b)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links of the rb unit
which has one link from the d1 unit to one of its sites and
one link from the rho unit to the other site.
*/
count_d1 = 0;
count_rho = 0;
unit_ptr = *topo_rb_ptr;
site_ptr1 = NULL;
site_ptr2 = NULL;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_SPEC_LAY) {
switch (link_ptr->to->lun) {
case ARTMAP_D1_UNIT:
count_d1++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_RHO_UNIT:
count_rho++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_d1 != 1) || (count_rho != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the rm unit
it has inputs from all map units
*/
count_map = 0;
unit_ptr = *topo_rm_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (link_ptr->to->lln == ARTMAP_MAP_LAY) {
count_map++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_map != ArtMap_NoOfRecUnits_b) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the rg unit
it has inputs from the rb and the rm unit
*/
count_rb = 0;
count_rm = 0;
unit_ptr = *topo_rg_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPEC_LAY :
switch (link_ptr->to->lun) {
case ARTMAP_RB_UNIT:
count_rb++;
break;
case ARTMAP_RM_UNIT:
count_rm++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_rb != 1) || (count_rm != 1)) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the rho unit
it has inputs just from itself
*/
count_rho = 0;
unit_ptr = *topo_rho_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
if (unit_ptr == link_ptr->to) {
count_rho++;
} else {
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*if*/
} /*FOR_ALL_LINKS*/
if (count_rho != 1) {
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* next we check the links to the qu unit
it has inputs from all inpa units to one of its sites and
from all cmpa units to the other site.
*/
count_inpa = 0;
count_cmpa = 0;
unit_ptr = *topo_qu_ptr;
site_ptr1 = NULL;
site_ptr2 = NULL;
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
TOPO_MSG_UNEXPECTED_DIRECT_INPUTS (unit_ptr);
} /*if*/
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_INPa_LAY :
count_inpa++;
if ((site_ptr2 != NULL) && (site_ptr2 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr2 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
case ARTMAP_CMPa_LAY :
count_cmpa++;
if ((site_ptr1 != NULL) && (site_ptr1 != site_ptr)) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
site_ptr1 = site_ptr;
if (site_ptr1 == site_ptr2) {
TOPO_MSG_LINK_TO_WRONG_SITE (link_ptr->to, unit_ptr);
} /*if*/
break;
default :
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_SITES_AND_LINKS*/
if ((count_inpa != ArtMap_NoOfInpUnits_a) ||
(count_cmpa != ArtMap_NoOfInpUnits_a)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
/* finally we check the links to the drho unit
it has inputs from itself, from the rg unit, from the qu unit
and from the rhoa unit
*/
count_drho = 0;
count_rg = 0;
count_qu = 0;
count_rhoa = 0;
count_rga = 0;
count_clb = 0;
unit_ptr = *topo_drho_ptr;
if (UNIT_HAS_SITES (unit_ptr)) {
TOPO_MSG_UNEXPECTED_SITES (unit_ptr);
} /*if*/
FOR_ALL_LINKS (unit_ptr, link_ptr) {
switch (link_ptr->to->lln) {
case ARTMAP_SPEC_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_DRHO_UNIT:
count_drho++;
break;
case ARTMAP_RG_UNIT:
count_rg++;
break;
case ARTMAP_QU_UNIT:
count_qu++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
break;
case ARTMAP_SPECa_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_RHOa_UNIT:
count_rhoa++;
break;
case ARTMAP_RGa_UNIT:
count_rga++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
case ARTMAP_SPECb_LAY:
switch (link_ptr->to->lun) {
case ARTMAP_CLb_UNIT:
count_clb++;
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
break;
} /*switch*/
break;
default:
TOPO_MSG_UNEXPECTED_LINK (link_ptr->to, unit_ptr);
} /*switch*/
} /*FOR_ALL_LINKS*/
if ((count_drho != 1) || (count_rg != 1) ||
(count_qu != 1) || (count_rhoa != 1) ||
(count_rga != 1) || (count_clb != 1)
)
{
TOPO_MSG_LINK_MISSING (unit_ptr);
} /*if*/
return (ret_code);
} /* kram_LinksToSpecUnits () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/* NOTE: Don't call this function unless net has been topologically sorted
with type ARTMAP_TOPO_TYPE
*/
static krui_err kram_init_fix_weights (void)
{
int ret_code = KRERR_NO_ERROR;
register struct Unit *unit_ptr;
register struct Site *site_ptr;
register struct Link *link_ptr;
FOR_ALL_UNITS (unit_ptr) {
if (UNIT_HAS_INPUTS (unit_ptr)) {
if (UNIT_HAS_DIRECT_INPUTS (unit_ptr)) {
FOR_ALL_LINKS (unit_ptr, link_ptr) {
kram_set_fix_weight (link_ptr->to, unit_ptr, &(link_ptr->weight));
} /*FOR_ALL_LINKS*/
} else {
FOR_ALL_SITES_AND_LINKS (unit_ptr, site_ptr, link_ptr) {
kram_set_fix_weight (link_ptr->to, unit_ptr, &(link_ptr->weight));
} /*FOR_ALL_SITES_AND_LINKS*/
} /*if*/
} /*if*/
} /*FOR_ALL_UNITS*/
return (ret_code);
} /* kram_init_fix_weights () */
/*___________________________________________________________________________*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static void kram_set_fix_weight (struct Unit *src_unit, struct Unit *trgt_unit, FlintType *weight)
{
switch (src_unit->lln) {
case ARTMAP_INPa_LAY:
switch (trgt_unit->lln) {
case ARTMAP_CMPa_LAY:
*weight = ARTMAP_LINK_INPa_CMPa;
break;
case ARTMAP_SPECa_LAY:
switch (trgt_unit->lun) {
case ARTMAP_G1a_UNIT:
*weight = ARTMAP_LINK_INPa_G1a;
break;
case ARTMAP_RIa_UNIT:
*weight = ARTMAP_LINK_INPa_RIa;
break;
case ARTMAP_G2a_UNIT:
*weight = ARTMAP_LINK_INPa_G2a;
break;
} /*switch*/
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_INPa_QU;
break;
} /*switch*/
break;
case ARTMAP_CMPa_LAY:
switch (trgt_unit->lln) {
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_CMPa_RCa;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_CMPa_QU;
break;
} /*switch*/
break;
case ARTMAP_RECa_LAY:
switch (trgt_unit->lln) {
case ARTMAP_DELa_LAY:
*weight = ARTMAP_LINK_RECa_DELa;
break;
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_RECa_G1a;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_RECa_G;
break;
} /*switch*/
break;
case ARTMAP_DELa_LAY:
switch (trgt_unit->lln) {
case ARTMAP_DELa_LAY:
*weight = ARTMAP_LINK_DELa_DELa;
break;
case ARTMAP_RSTa_LAY:
*weight = ARTMAP_LINK_DELa_RSTa;
break;
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_DELa_CLa;
break;
} /*switch*/
break;
case ARTMAP_RSTa_LAY:
switch (trgt_unit->lln) {
case ARTMAP_RECa_LAY:
*weight = ARTMAP_LINK_RSTa_RECa;
break;
case ARTMAP_RSTa_LAY:
*weight = ARTMAP_LINK_RSTa_RSTa;
break;
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_RSTa_NCa;
break;
} /*switch*/
break;
case ARTMAP_SPECa_LAY:
switch (src_unit->lun) {
case ARTMAP_CLa_UNIT:
*weight = ARTMAP_LINK_CLa_CL;
break;
case ARTMAP_NCa_UNIT:
*weight = ARTMAP_LINK_NCa_NC;
break;
case ARTMAP_G1a_UNIT:
*weight = ARTMAP_LINK_G1a_CMPa;
break;
case ARTMAP_RIa_UNIT:
*weight = ARTMAP_LINK_RIa_RGa;
break;
case ARTMAP_RCa_UNIT:
*weight = ARTMAP_LINK_RCa_RGa;
break;
case ARTMAP_RGa_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_RECa_LAY:
*weight = ARTMAP_LINK_RGa_RECa;
break;
case ARTMAP_RSTa_LAY:
*weight = ARTMAP_LINK_RGa_RSTa;
break;
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_RGa_CLa;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_RGa_DRHO;
} /*switch*/
break;
case ARTMAP_RHOa_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_SPECa_LAY:
switch (trgt_unit->lun) {
case ARTMAP_RIa_UNIT:
*weight = ARTMAP_LINK_RHOa_RIa;
break;
case ARTMAP_RHOa_UNIT:
*weight = ARTMAP_LINK_RHOa_RHOa;
break;
} /*switch*/
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_RHOa_DRHO;
break;
} /*switch*/
break;
case ARTMAP_G2a_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_RECa_LAY:
*weight = ARTMAP_LINK_G2a_RECa;
break;
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_G2a_CLa;
break;
} /*switch*/
break;
} /*switch*/
break;
case ARTMAP_INPb_LAY:
switch (trgt_unit->lln) {
case ARTMAP_CMPb_LAY:
*weight = ARTMAP_LINK_INPb_CMPb;
break;
case ARTMAP_SPECb_LAY:
switch (trgt_unit->lun) {
case ARTMAP_G1b_UNIT:
*weight = ARTMAP_LINK_INPb_G1b;
break;
case ARTMAP_RIb_UNIT:
*weight = ARTMAP_LINK_INPb_RIb;
break;
case ARTMAP_G2b_UNIT:
*weight = ARTMAP_LINK_INPb_G2b;
break;
} /*switch*/
break;
} /*switch*/
break;
case ARTMAP_CMPb_LAY:
switch (trgt_unit->lln) {
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_CMPb_RCb;
break;
} /*switch*/
case ARTMAP_RECb_LAY:
switch (trgt_unit->lln) {
case ARTMAP_DELb_LAY:
*weight = ARTMAP_LINK_RECb_DELb;
break;
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_RECb_G1b;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_RECb_G;
break;
} /*switch*/
break;
case ARTMAP_DELb_LAY:
switch (trgt_unit->lln) {
case ARTMAP_DELb_LAY:
*weight = ARTMAP_LINK_DELb_DELb;
break;
case ARTMAP_RSTb_LAY:
*weight = ARTMAP_LINK_DELb_RSTb;
break;
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_DELb_CLb;
break;
case ARTMAP_MAP_LAY:
*weight = ARTMAP_LINK_DELb_MAP;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_DELb_D1;
break;
} /*switch*/
break;
case ARTMAP_RSTb_LAY:
switch (trgt_unit->lln) {
case ARTMAP_RECb_LAY:
*weight = ARTMAP_LINK_RSTb_RECb;
break;
case ARTMAP_RSTb_LAY:
*weight = ARTMAP_LINK_RSTb_RSTb;
break;
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_RSTb_NCb;
break;
} /*switch*/
break;
case ARTMAP_SPECb_LAY:
switch (src_unit->lun) {
case ARTMAP_CLb_UNIT:
switch (trgt_unit->lun) {
case ARTMAP_CL_UNIT:
*weight = ARTMAP_LINK_CLb_CL;
break;
case ARTMAP_DRHO_UNIT:
*weight = ARTMAP_LINK_CLb_DRHO;
break;
} /*switch*/
break;
case ARTMAP_NCa_UNIT:
*weight = ARTMAP_LINK_NCb_NC;
break;
case ARTMAP_G1b_UNIT:
*weight = ARTMAP_LINK_G1b_CMPb;
break;
case ARTMAP_RIb_UNIT:
*weight = ARTMAP_LINK_RIb_RGb;
break;
case ARTMAP_RCb_UNIT:
*weight = ARTMAP_LINK_RCb_RGb;
break;
case ARTMAP_RGb_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_RECb_LAY:
*weight = ARTMAP_LINK_RGb_RECb;
break;
case ARTMAP_RSTb_LAY:
*weight = ARTMAP_LINK_RGb_RSTb;
break;
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_RGb_CLb;
break;
} /*switch*/
break;
case ARTMAP_RHOb_UNIT:
switch (trgt_unit->lun) {
case ARTMAP_RIb_UNIT:
*weight = ARTMAP_LINK_RHOa_RIa;
break;
case ARTMAP_RHOb_UNIT:
*weight = ARTMAP_LINK_RHOa_RHOa;
break;
} /*switch*/
break;
case ARTMAP_G2b_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_RECb_LAY:
*weight = ARTMAP_LINK_G2b_RECb;
break;
case ARTMAP_SPECb_LAY:
*weight = ARTMAP_LINK_G2b_CLb;
break;
} /*switch*/
break;
} /*switch*/
break;
case ARTMAP_MAP_LAY:
switch (trgt_unit->lln) {
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_MAP_RM;
break;
case ARTMAP_DELb_LAY:
*weight = ARTMAP_LINK_MAP_DELb;
break;
} /*switch*/
break;
case ARTMAP_SPEC_LAY:
switch (src_unit->lun) {
case ARTMAP_D1_UNIT:
*weight = ARTMAP_LINK_D1_RB;
break;
case ARTMAP_G_UNIT:
*weight = ARTMAP_LINK_G_MAP;
break;
case ARTMAP_RB_UNIT:
*weight = ARTMAP_LINK_RB_RG;
break;
case ARTMAP_RM_UNIT:
*weight = ARTMAP_LINK_RM_RG;
break;
case ARTMAP_RG_UNIT:
switch (trgt_unit->lun) {
case ARTMAP_CL_UNIT:
*weight = ARTMAP_LINK_RG_CL;
break;
case ARTMAP_DRHO_UNIT:
*weight = ARTMAP_LINK_RG_DRHO;
break;
} /*switch*/
break;
case ARTMAP_RHO_UNIT:
switch (trgt_unit->lun) {
case ARTMAP_RB_UNIT:
*weight = ARTMAP_LINK_RHO_RB;
break;
case ARTMAP_RHO_UNIT:
*weight = ARTMAP_LINK_RHO_RHO;
break;
} /*switch*/
break;
case ARTMAP_QU_UNIT:
*weight = ARTMAP_LINK_QU_DRHO;
break;
case ARTMAP_DRHO_UNIT:
switch (trgt_unit->lln) {
case ARTMAP_SPECa_LAY:
*weight = ARTMAP_LINK_DRHO_RHOa;
break;
case ARTMAP_SPEC_LAY:
*weight = ARTMAP_LINK_DRHO_DRHO;
break;
} /* switch */
break;
} /*switch*/
break;
} /*switch*/
} /* kram_set_fix_weight () */
/*___________________________________________________________________________*/